#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    // 创建播放类对象
    movie = new QMovie(":/new/prefix1/res/yes (1).gif");
    // 给组件设置播放内容
    ui->label_5->setMovie(movie);
    // 开始播放
    movie->start();

    ui->pushButtonSend->setEnabled(false);
    ui->pushButtonHistory->setEnabled(false);

    connect(ui->pushButtonHistory,SIGNAL(clicked()),
            this,SLOT(openHistorySlot()));

    connect(ui->pushButtonConn,SIGNAL(clicked()),
            this,SLOT(btnConnClickedSlot()));
    connect(ui->pushButtonSend,SIGNAL(clicked()),
            this,SLOT(btnSendClickedSlot()));

    client = new QTcpSocket(this);
    // 连接状态信号槽
    connect(client,SIGNAL(connected()),
            this,SLOT(connectedSlot()));
    connect(client,SIGNAL(disconnected()),
            this,SLOT(disconnectedSlot()));

    connectToDB();
}

Dialog::~Dialog()
{
    // 解除信号槽的连接
    disconnect(client,SIGNAL(disconnected()),
               this,SLOT(disconnectedSlot()));
    // 如果连接则断开
    if(client->isOpen())
        client->close();
    delete ui;
}

void Dialog::btnConnClickedSlot()
{
    // 先获得用户输入的IP地址和端口号Port
    QString ip = ui->lineEditIP->text();
    int port = ui->spinBoxPort->value();
    name = ui->lineEditName->text();
    // TODO 验证IP有效性
    // 验证IP有效性
    QRegularExpression ipRegex("^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$");
    QRegularExpressionMatch match = ipRegex.match(ip);
    if (!match.hasMatch()) {
        QMessageBox::warning(this, "错误", "请输入有效的IP地址");
        return;
    }
    if(name == "")
    {
        QMessageBox::warning(this,"提示","请输入用户名!");
        return;
    }
    // 接受消息信号槽的连接
    connect(client,SIGNAL(readyRead()),
            this,SLOT(readyReadSlot()));

    // 连接到服务器
    client->connectToHost(ip,port);
}

void Dialog::btnSendClickedSlot()
{
    QString dt = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    //获得用户输入的消息
    QString msg = ui->lineEditSend->text();
    msg = dt + '\n' + name + ":" + msg + '\n';
    if(msg == "")
    {
        QMessageBox::warning(this,"提示","请输入内容!");
        return;
    }

    // 方法一：使用QByteArray
    QByteArray buffer = msg.toUtf8();
    client->write(buffer);

    // 清空输入框
    ui->lineEditSend->clear();
}

void Dialog::connectedSlot()
{
    // 屏蔽按钮和输入
    ui->pushButtonConn->setEnabled(false);
    ui->lineEditIP->setEnabled(false);
    ui->lineEditName->setEnabled(false);
    ui->spinBoxPort->setEnabled(false);
    ui->pushButtonConn->setText("已连接");
    // 恢复发送按钮
    ui->pushButtonSend->setEnabled(true);
    ui->pushButtonHistory->setEnabled(true);
}

void Dialog::disconnectedSlot()
{
    // 恢复按钮和输入
    ui->pushButtonConn->setEnabled(true);
    ui->lineEditIP->setEnabled(true);
    ui->lineEditName->setEnabled(true);
    ui->spinBoxPort->setEnabled(true);
    ui->pushButtonConn->setText("连接");
    // 屏蔽发送按钮
    ui->pushButtonSend->setEnabled(false);
    ui->pushButtonHistory->setEnabled(false);
    // 弹窗提示
    QMessageBox::warning(this,"提示",client->errorString());
}

void Dialog::readyReadSlot()
{
    // 方法一：读取所有内容
    QByteArray buf = client->readAll();
    QString text(buf); // 转换为字符串

    qDebug() << text;

    QStringList parts = text.split('\n');

    if (parts.size() >= 2) {
        QString datetime = parts[0];   // 第一部分：日期+时间
        QString nameAndMessage = parts[1];   // 第三部分：姓名和消息

        // 进一步拆分姓名和消息
        QStringList nameAndMessageParts = nameAndMessage.split(":");
        if (nameAndMessageParts.size() >= 2) {
            QString name = nameAndMessageParts[0];   // 姓名
            QString message = nameAndMessageParts[1];   // 消息

            // 存入数据库-------------------
            // 预处理的SQL语句
            QString sql = "INSERT INTO group_history VALUES(?,?,?);";
            // 先预处理SQL语句
            QSqlQuery sq;
            sq.prepare(sql);
            // 绑定参数
            sq.addBindValue(datetime);
            sq.addBindValue(name);
            sq.addBindValue(message);
            // 执行SQL语句
            if(!sq.exec())
            {
                // 获得错误信息对象
                QSqlError info = sq.lastError();
                // 获得错误信息文本
                QString text = info.text();
                QMessageBox::warning(this,"通知",text);
            }
        }
    }
    // 输出
    ui->textBrowser->append(text);
}

void Dialog::openHistorySlot()
{
    // 创建MyDialog对象
    d = new History(this);
    d->show();
    // 屏蔽按钮
    //    ui->pushButtonHistory->setEnabled(false);
}


void Dialog::connectToDB()
{
    // 获得数据库连接对象
    db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称
    db.setDatabaseName("chat_history.db");
    // 打开数据库连接
    if(db.open())
    {
        qDebug() << "数据库连接成功";
        createTable();
    }
    else
    {
        // 获得错误信息对象
        QSqlError info = db.lastError();
        // 获得错误信息文本
        QString text = info.text();
        // 展示
        QMessageBox::critical(this,"错误",text);
    }
}

void Dialog::createTable()
{
    QString sql = QString("CREATE TABLE group_history(\
                          time TEXT,\
                          name TEXT,\
                          message TEXT\
                          );");
    // 数据库操作类对象
    QSqlQuery sq;
    // 执行SQL语句
    if(sq.exec(sql))
    {
        qDebug() << "创建数据表成功";
    }
    else
    {
        // 获得错误信息对象
        QSqlError info = sq.lastError();
        // 获得错误信息文本
        QString text = info.text();
        qDebug() << "建表失败" << text;
    }
}
